﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Collections;


namespace hse_2013_database
{
    public partial class MainForm : Form
    {
        /// <summary>
        /// массив с найденными элементами в поиске
        /// </summary>
        List<Book> poisk = new List<Book>();
        /// <summary>
        ///индексы найденных элементов в основном массиве
        /// </summary>
        ArrayList indeksi = new ArrayList();
        /// <summary>
        /// индексы элементов подлежащих удалению
        /// </summary>
        ArrayList udalenie = new ArrayList();
        /// <summary>
        /// Находимся в поиске или нет
        /// </summary>
        bool isPoisk;
        /// <summary>
        /// Переменная с данными
        /// </summary>
        IDataProvider mass;
        /// <summary>
        ///переменная которая инкрементируется при попытке выхода из приложения 
        /// </summary>
        int n = 0;

        private bool isDemoVariant=false;
        public MainForm()
        {
            InitializeComponent();
        }
        /// <summary>
        /// Свойства режима работы программы
        /// </summary>
        public bool IsDemoVariant { get { return isDemoVariant; } set {isDemoVariant=value;} }

        /// <summary>
        /// Загрузка формы
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void MainForm_Load(object sender, EventArgs e)
        {
            if (this.isDemoVariant == true) safeButton.Enabled = false;
            isPoisk=changeButton.Enabled = endPoiskButton.Enabled = changeTextBox.Enabled = false;
            //В зависимости от режима работы программы получаем данные
            if (this.IsDemoVariant == true)
            {
                mass = new TestDataProvider();
            }
            else
            {
                mass = new FileDataProvider();
            }
            for (int i = 0; i < mass.getBooks().Count; i++)
            {
                dataGridView1.Rows.Add(mass.getBooks()[i].Nazvanie, mass.getBooks()[i].Author, mass.getBooks()[i].Stranic, mass.getBooks()[i].Kolvo, mass.getBooks()[i].Izdatelstvo, mass.getBooks()[i].Place);
            }

        }
        /// <summary>
        /// Добавление книги
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void addButton_Click(object sender, EventArgs e)
        {
            string nknigi = "", avtr = "", izdat = "",place="";//переменные для считывания информации
            uint kstr = 0, vnalich = 0;string errshow = "Ошибки: \n";//строка для для справки об ошибках
            bool errflag1 = false, errflag2 = false, errflag3 = false, errflag4 = false,
                errflag5 = false, errflag6 = false;//переменные принимающие true в случае неккоректного ввода 
            
            try
            {
                if (nameTextBox.Text == "") throw new InvalidCastException();//если не введен текст вызывает исключение
                nknigi = nameTextBox.Text;//присваиваем nknigi значение textbox1 при корректном вводе

            }
            catch (InvalidCastException)//исключение при отсутствии текста
            {
                errflag1 = true;
                nameTextBox.Clear();
                errshow += "не введён текст в поле \"Название книги\"\n";//добавляем в строку с ошибками данный текст
            }

            try
            {
                if (authorTextBox.Text == "") throw new InvalidCastException();//если не введен текст вызывает исключение
                avtr = authorTextBox.Text;//присваиваем avtr значение textbox2 при корректном вводе
            }

            catch//исключение при отсутствии текста
            {

                errflag2 = true;
                authorTextBox.Clear();
                errshow += "не введён текст в поле \"Автор книги\"\n";//добавляем в строку с ошибками данный текст
            }

            try
            {
                if (stranicTextBox.Text == "") throw new InvalidCastException();//если не введен текст вызывает исключение
                uint proverka = uint.Parse(stranicTextBox.Text);
                if (proverka == 0) throw new IndexOutOfRangeException();//если введено нулевое количество страниц вызываем исключение
                kstr = proverka;//присваиваем kstr значение textbox3 при корректном вводе

            }
            catch (InvalidCastException)//исключение при отсутствии текста
            {

                errflag3 = true;
                stranicTextBox.Clear();
                errshow += "не введён текст в поле \"Количество страниц\"\n";//добавляем в строку с ошибками данный текст
            }
            catch (IndexOutOfRangeException)//исключение, если введено нулевое количество страниц
            {
                errflag3 = true;
                stranicTextBox.Clear();
                errshow += "введено нулевое значение поля \"Количество страниц\"\n";//добавляем в строку с ошибками данный текст
            }
            catch//исключение при неправильном приведении типов
            {

                errflag3 = true;
                stranicTextBox.Clear();
                errshow += "введено нечисловое или отрицательное значение поля \"Количество страниц\"\n";//добавляем в строку с ошибками данный текст
            }

            try
            {
                if (kolvoTextBox.Text == "") throw new InvalidCastException();//если не введен текст вызывает исключение
                vnalich = uint.Parse(kolvoTextBox.Text);
                 
            }
            catch (InvalidCastException)//исключение при отсутствии текста
            {

                errflag4 = true;
                kolvoTextBox.Clear();
                errshow += "не введён текст в поле \"Книг в наличии\"\n";//добавляем в строку с ошибками данный текст
            }
            catch//исключение при неправильном приведении типов
            {

                errflag4 = true;
                kolvoTextBox.Clear();
                errshow += "введено нечисловое или отрицательное значение поля \"Книг в наличии\"\n";//добавляем в строку с ошибками данный текст
            }

            try
            {
                if (izdatelstvoTextBox.Text == "") throw new InvalidCastException();//если не введен текст вызывает исключение
                izdat = izdatelstvoTextBox.Text;//присваиваем izdat значение textbox10

            }
            catch (InvalidCastException)//исключение при отсутствии текста
            {

                errflag5 = true;
                izdatelstvoTextBox.Clear();
                errshow += "не введён текст в поле \"Издательство\"\n";//добавляем в строку с ошибками данный текст
            }
            try
            {
                if (placeComboBox.SelectedItem==null) throw new InvalidCastException();//если не введен текст вызывает исключение
                place = placeComboBox.SelectedItem.ToString();//присваиваем izdat значение textbox10

            }
            catch (InvalidCastException)//исключение при отсутствии текста
            {

                errflag6 = true;
                errshow += "не выбран корпус\n";//добавляем в строку с ошибками данный текст
            }


            if (errflag1 == true || errflag2 == true || errflag3 == true || errflag4 == true || errflag5 == true || errflag6 == true )
                MessageBox.Show(errshow, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);//при неккоректном вводе в каком-нибудь из TextBox выводится MessageBox с ошибками

            else//при корректном вводе проверяем существование такой же книги в базе, при отсутствии добавляем книгу в массив и таблицу
            {
                bool pr = false;//принимает значение true при существовании такой же книги
                for (int i = 0; i < mass.getBooks().Count; i++)
                {   //сравнение названия, автора, количества страниц и издательства существующих книг с добавленной
                    if (mass.getBooks()[i].Nazvanie == nknigi && mass.getBooks()[i].Author == avtr && mass.getBooks()[i].Stranic == kstr && mass.getBooks()[i].Izdatelstvo == izdat) pr = true;
                }
                if (pr)//если такая же книга существует
                {
                    MessageBox.Show("Точно такая же книга уже существует в базе", "Информация", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    nameTextBox.Clear();//очищаем все TextBox
                    authorTextBox.Clear();
                    stranicTextBox.Clear();
                    kolvoTextBox.Clear();
                    izdatelstvoTextBox.Clear();
                }
                else//если аналогичной книги в базе нет
                {
                    mass.Add(new Book(nknigi, avtr, kstr, vnalich, izdat,place));//добавляем ссылку на объект в динамический массив
                    dataGridView1.Rows.Add(nknigi, avtr, kstr.ToString(), vnalich.ToString(), izdat,place);//выводим данные в таблице
                    nameTextBox.Clear();//очищаем все TextBox
                    authorTextBox.Clear();
                    stranicTextBox.Clear();
                    kolvoTextBox.Clear();
                    izdatelstvoTextBox.Clear();
                    placeComboBox.SelectedIndex = -1;
                    
                }
            }
        }
        /// <summary>
        /// Изменение цвета кнопки при изменении свойства Enabled
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void safeButton_EnabledChanged(object sender, EventArgs e)
        {
            if (safeButton.Enabled == false)
            {
                safeButton.ForeColor = SystemColors.GrayText;
                safeButton.BackColor = SystemColors.Control;
            }
            else
            {
                safeButton.BackColor = Color.NavajoWhite;
                safeButton.ForeColor = Color.Sienna;
            }
        }
        /// <summary>
        /// Изменение цвета кнопки при изменении свойства Enabled
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void endButton_EnabledChanged(object sender, EventArgs e)
        {
            if (endPoiskButton.Enabled == false)
            {
                endPoiskButton.ForeColor = SystemColors.GrayText;
                endPoiskButton.BackColor = SystemColors.Control;
            }
            else
            {
                endPoiskButton.BackColor = Color.NavajoWhite;
                endPoiskButton.ForeColor = Color.Sienna;
            }
        }
        /// <summary>
        /// Изменение цвета кнопки при изменении свойства Enabled
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void changeButton_EnabledChanged(object sender, EventArgs e)
        {
            if (changeButton.Enabled == false)
            {
                changeButton.ForeColor = SystemColors.GrayText;
                changeButton.BackColor = SystemColors.Control;
            }
            else
            {
                changeButton.BackColor = Color.NavajoWhite;
                changeButton.ForeColor = Color.Sienna;
            }
        }
        /// <summary>
        /// Изменение цвета текстбокса при изменении свойства Enabled
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void textBox8_EnabledChanged(object sender, EventArgs e)
        {
            if (changeTextBox.Enabled == false)
            {
                changeTextBox.BackColor = SystemColors.Control;
            }
            else
            {
                changeTextBox.BackColor = Color.NavajoWhite;
            }
        }
        /// <summary>
        /// Удаление книги
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void deleteButton_Click(object sender, EventArgs e)
        {
            //блокирование кнопки и текстбокса, относящегося к редактированию информации о книге 
            changeButton.Enabled = changeTextBox.Enabled = false;
            changeTextBox.Clear();
            try
            {
                DataGridViewRow rw = dataGridView1.SelectedRows[0];//создаём объект, который ссылается на выбранный элемент в таблице
                if (isPoisk == false) mass.Delete(rw.Index);//если удаляем книгу не во время поиска по базе, то просто удаляем из массива с книгами
                else
                {   //если удаление осуществляется во время поиска, добавляем индекс удаляемого элемента в массив
                    udalenie.Add(indeksi[rw.Index]);
                }
                dataGridView1.Rows.Remove(dataGridView1.SelectedRows[0]);//удаляем выбранную строку таблицы
            }

            catch//в случае если не выбрана строка выводим сообщение
            {
                MessageBox.Show("Не выбрана строка в таблице ", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
        /// <summary>
        /// Сохранение книг
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void safeButton_Click(object sender, EventArgs e)
        {
            ((FileDataProvider)mass).Safe();
            MessageBox.Show("База успешно сохранена", "Информация", MessageBoxButtons.OK, MessageBoxIcon.Information);
        }
        /// <summary>
        /// Очистка базы
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button4_Click(object sender, EventArgs e)
        {
            //Вопрос пользователю о действительности его намерения о удалении базы
            DialogResult rslt = MessageBox.Show("Вы точно хотите очистить базу?", "Выход", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
            if (rslt == DialogResult.Yes)
            {   //при положительном ответе очищаем массив с книгами и таблицу
                dataGridView1.Rows.Clear();
                mass.DeleteAll();
            }
        }
        /// <summary>
        /// Выход в главное меню
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button5_Click(object sender, EventArgs e)
        {
            if (this.IsDemoVariant == false)
            {
                //Вопрос пользователю о намерении сохранить базу
                DialogResult rslt = MessageBox.Show("Сохранить изменения перед выходом из профиля?", "Выход", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question);
                if (rslt == DialogResult.Yes)//если ответ положителен
                {
                    ((FileDataProvider)mass).Safe();
                    n++;//инкапсулирование переменной, для того, чтобы не возникало собыитие Form3_FormClosing
                    this.Close();//закрытие формы

                }
                else if (rslt == DialogResult.No)//отрицательный ответ
                {
                    n++;//инкапсулирование переменной, для того, чтобы не возникало собыитие Form3_FormClosing
                    this.Close();//закрытие формы
                }
            }
            else
            {
                n++;//инкапсулирование переменной, для того, чтобы не возникало собыитие Form3_FormClosing
                this.Close();//закрытие формы
            }
        }
        /// <summary>
        /// Выход из приложения
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (n == 0)//если выхода в главное меню не было
            {
                if (this.IsDemoVariant == false)
                {
                    //Вопрос пользователю о намерении сохранить базу
                    DialogResult rslt = MessageBox.Show("Сохранить изменения перед выходом из программы?", "Выход", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question);
                    if (rslt == DialogResult.Yes)//если ответ положителен
                    {
                        ((FileDataProvider)mass).Safe();
                        n++;
                        Application.Exit();
                    }
                    else if (rslt == DialogResult.No)//отрицательный ответ
                    {
                        n++;
                        Application.Exit();
                    }
                    else e.Cancel = true;
                }
                else
                {
                    DialogResult dr = MessageBox.Show("Вы действительно хотите выйти?"
                                , "Выход", MessageBoxButtons.YesNo, MessageBoxIcon.Question);//проверка на действительность намерения пользователя выйти
                    if (dr == DialogResult.Yes)//при положительном ответе закрываем приложение
                    {
                        n++;
                        Application.Exit();
                    }
                    else e.Cancel = true;
                }
            }
        }
        /// <summary>
        /// Нажатие на клетку с количеством книг в наличии, для редактирования
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void dataGridView1_CellMouseClick(object sender, DataGridViewCellMouseEventArgs e)
        {
            if ((dataGridView1.SelectedCells.Count != 0) && (dataGridView1.SelectedCells[0].ColumnIndex == 3) && (dataGridView1.SelectedCells[0].Value.ToString()) != null)
            {
                changeTextBox.Text = dataGridView1.SelectedCells[0].Value.ToString();//старое значение цены для редактирования
                changeButton.Enabled = changeTextBox.Enabled = true;//разблокируются необходимые для редактирования элементы
                
            }
            
            else//иначе очищаем и блокируем все элементы относящиеся к редактированию
            {
                changeTextBox.Enabled = changeButton.Enabled = false;
                changeTextBox.Clear();
            }
        }
        /// <summary>
        /// Нажатие на строку в dataGridView для редактирования книги
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void dataGridView1_RowHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
        {
            //добавление в текстбоксы информации
            changeTextBox.Text = dataGridView1.SelectedRows[0].Cells[3].Value.ToString();//о выбранной в таблице книге
            if (((string)dataGridView1.SelectedRows[0].Cells[0].Value) != null)//если выбрана строка делаем доступными текстбоксы и кнопки
            {
                 changeTextBox.Enabled = changeButton.Enabled = true;
            }//в противном случае блокируем их
            else changeTextBox.Enabled = changeButton.Enabled = false;
        }
        /// <summary>
        /// Поиск книги
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void poiskButton_Click(object sender, EventArgs e)
        {
            //если выбрана категория поиска осуществляем его
            if (radioButton1.Checked == true || radioButton2.Checked == true || radioButton3.Checked == true)
            {
                if (mass.getBooks().Count != 0)//если количество книг в базе ненулевое продолжаем поиск
                {
                    string psk = "";//строка для поиска
                    try
                    {
                        if (poiskTextBox.Text == "") throw new InvalidCastException();//если не введен текст вызывает исключение
                        psk = poiskTextBox.Text;//присваиваем psk значение textbox11
                        poisk.Clear();//очищаем массив в котором может быть хранились элементы от предыдущего поиска
                        indeksi.Clear();//очищаем массив в котором может быть хранились индексы элементов из предыдущего поиска
                        if (radioButton1.Checked == true)//если ищем по названию
                        {
                            for (int i = 0; i < mass.getBooks().Count; i++)//перебираем каждую книгу
                            {
                                if (mass.getBooks()[i].compare(psk, 0))//при вхождении строки psk в название книги возвращает true
                                {
                                    //книги в названиях которых присутствует вхождение строки psk добавляем в массивы
                                    poisk.Add(mass.getBooks()[i]);
                                    indeksi.Add(i);
                                }
                            }
                        }
                        else if (radioButton2.Checked == true)//если ищем по автору
                        {
                            for (int i = 0; i < mass.getBooks().Count; i++)//перебираем каждую книгу
                            {
                                if (mass.getBooks()[i].compare(psk, 1))//при вхождении строки psk в строку с автором книги возвращает true
                                {
                                    //книги в строках с автором которых присутствует вхождение строки psk добавляем в массивы
                                    poisk.Add(mass.getBooks()[i]);
                                    indeksi.Add(i);
                                }
                            }
                        }
                        else//если ищем по издательству
                        {
                            for (int i = 0; i < mass.getBooks().Count; i++)//перебираем каждую книгу
                            {
                                if (mass.getBooks()[i].compare(psk, 2))//при вхождении строки psk в строку с издательством книги возвращает true
                                {
                                    //книги в названиях издательств которых присутствует вхождение строки psk добавляем в массивы
                                    poisk.Add(mass.getBooks()[i]);
                                    indeksi.Add(i);
                                }
                            }
                        }
                        if (poisk.Count == 0)//если книг не найдено выводим сообщение
                        {
                            MessageBox.Show("По заданным параметрам книг не найдено", "Информация", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        }
                        else
                        {
                            //блокируем кнопки и текстбоксы относящиеся к редактированию
                            changeTextBox.Enabled = changeButton.Enabled =addButton.Enabled= false;
                            changeTextBox.Clear();
                            endPoiskButton.Enabled = true;
                            isPoisk = true;//говорит о том, что был осуществлён поиск
                            dataGridView1.Rows.Clear();//очищаем таблицу
                            for (int i = 0; i < poisk.Count; i++)//выводим в таблице найденные элементы
                            {
                                dataGridView1.Rows.Add(poisk[i].Nazvanie, poisk[i].Author, poisk[i].Stranic, poisk[i].Kolvo, poisk[i].Izdatelstvo,poisk[i].Place);
                            }
                        }
                    }
                    catch (InvalidCastException)//исключение при отсутствии текста
                    {
                        poiskTextBox.Clear();
                        MessageBox.Show("Не введён текст для поиска", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }


                }
                else//если база пуста
                {
                    MessageBox.Show("Невозможно осуществить поиск по пустой базе", "Информация", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    poiskTextBox.Clear();
                }
            }
            else//если не выбран критерий для поиска
            {
                MessageBox.Show("Не выбран критерий для поиска", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
                poiskTextBox.Clear();
            }
        }
        /// <summary>
        /// Изменение цвета кнопки при изменении свойства Enabled
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void addButton_EnabledChanged(object sender, EventArgs e)
        {
            if (addButton.Enabled == false)
            {
                addButton.ForeColor = SystemColors.GrayText;
                addButton.BackColor = SystemColors.Control;
            }
            else
            {
                addButton.BackColor = Color.NavajoWhite;
                addButton.ForeColor = Color.Sienna;
            }
        }
        /// <summary>
        /// Выход из режима поиска
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void endButton_Click(object sender, EventArgs e)
        {
            poiskTextBox.Clear();
            isPoisk=changeButton.Enabled = changeTextBox.Enabled = endPoiskButton.Enabled= false;
            changeTextBox.Clear();
            dataGridView1.Rows.Clear();//очищаем таблицу от найденных элементов
            addButton.Enabled = true;//открытие доступа к кнопке добавления книг
            int v = 0;//переменная для перечисления в массиве найденных книг
            int k = 0;//переменная для перечисления в массиве удаленных книг
            for (int i = 0; i < mass.getBooks().Count; i++)
            {   //книги которые были найдены в поиске заменяют их старые аналоги 
                //в основном массиве книг, на случай если они были изменены
                if ((int)indeksi[v] == i)
                {
                    mass.getBooks()[i] = poisk[v];
                    if (v != indeksi.Count - 1) v++;
                }
            }
            if (udalenie.Count != 0)//если во время поиска были удалены элементы
            {
                List<Book> buf = new List<Book>();//массив в который будут помещены элементы которые не удалили
                for (int i = 0; i < mass.getBooks().Count; i++)
                {
                    if ((int)udalenie[k] != i)//если элемент не удален добавляем его в массив
                    {
                        buf.Add(mass.getBooks()[i]);
                    }
                    else
                    {
                        if (k != udalenie.Count - 1) k++;
                    }
                }
                mass.ChangeList(buf); //массив с оставшимися элементами
            }
            for (int i = 0; i < mass.getBooks().Count; i++)
            {
                //заполнение таблицы книгами после поиска
                dataGridView1.Rows.Add(mass.getBooks()[i].Nazvanie, mass.getBooks()[i].Author, mass.getBooks()[i].Stranic,  mass.getBooks()[i].Kolvo, mass.getBooks()[i].Izdatelstvo,mass.getBooks()[i].Place);
            }
        
        }
        /// <summary>
        /// Изменение колическа книг в наличии
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void changeButton_Click(object sender, EventArgs e)
        {
            uint kolv = 0;//количество для изменения
            bool errFlag = false;//принимает значение true при некорретном вводе
            try
            {
                if (changeTextBox.Text == "") throw new InvalidCastException();//если не введен текст вызывает исключение
                kolv = uint.Parse(changeTextBox.Text);

            }
            catch (InvalidCastException)//если не введен текст
            {
                errFlag = true;
                changeTextBox.Clear();
                //информация об ошибке
                MessageBox.Show("Не введено количество книг в наличии для изменения", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);//добавляем в строку с ошибками данный текст
            }
            catch//при неправильном приведении типов
            {
                errFlag = true;
                changeTextBox.Clear();
                //информация об ошибке
                MessageBox.Show("Введено нечисловое или отрицательное значение для изменения количества книг в наличии", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);//добавляем в строку с ошибками данный текст
            }
            if (errFlag != true)//если ввод корректен редактируем количество книг в наличии
            {
                try
                {
                    if (dataGridView1.SelectedRows.Count != 0)//если выбрана строка для редактирования
                    {
                        DataGridViewRow rw = dataGridView1.SelectedRows[0];//создаём объект, который ссылается на выбранный элемент в таблице
                        if (isPoisk == false)
                            mass.getBooks()[rw.Index].Kolvo = kolv;//если редактирование не во время поиска, меняем количество в массиве книг
                        else
                        {   //если редактирование во время поиска, меняем количество в массиве найденных книг
                            poisk[rw.Index].Kolvo = kolv;
                        }
                        dataGridView1.Rows[rw.Index].Cells[3].Value = kolv;//редактируем информацию в таблице
                    }//если выбранна клетка для редактирования и она является клеткой с количеством книг в наличии
                    else if ((dataGridView1.SelectedCells.Count != 0) && (dataGridView1.SelectedCells[0].ColumnIndex == 3))
                    {
                        DataGridViewCell cl = dataGridView1.SelectedCells[0];//объект ссылающийся на выбранную клетку
                        if (isPoisk == false)
                            mass.getBooks()[cl.RowIndex].Kolvo = kolv;//если редактирование не во время поиска, меняем количество
                        else
                        {
                            poisk[cl.RowIndex].Kolvo = kolv;
                        }
                        dataGridView1.Rows[cl.RowIndex].Cells[3].Value = kolv;//редактируем информацию в таблице
                    }
                    else MessageBox.Show("Не выбрана строка или клетка в таблице соответствующая количеству книг в наличии ", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }

                catch//в случае если не выбрана строка выводим сообщение
                {
                    MessageBox.Show("Не выбрана строка или клетка с количеством в наличии в таблице ", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
        }

    }
}
